home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / lib / geometry / point3 / point3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-08  |  4.8 KB  |  260 lines

  1. /* Copyright (c) 1992 The Geometry Center; University of Minnesota
  2.    1300 South Second Street;  Minneapolis, MN  55454, USA;
  3.    
  4. This file is part of geomview/OOGL. geomview/OOGL is free software;
  5. you can redistribute it and/or modify it only under the terms given in
  6. the file COPYING, which you should have received along with this file.
  7. This and other related software may be obtained via anonymous ftp from
  8. geom.umn.edu; email: software@geom.umn.edu. */
  9. static char *copyright = "Copyright (C) 1992 The Geometry Center";
  10.  
  11. /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */
  12.  
  13. /*
  14. **    point3.c - 3D vector arithmetic module.
  15. **
  16. **    pat hanrahan
  17. **
  18. */
  19. # include <math.h>
  20. # include "tolerance.h"
  21. # include "point3.h"
  22. # include "transform3.h"
  23.  
  24. Point3 Pt3Origin = { 0., 0., 0. };
  25.  
  26. /* print vector */
  27. void
  28. Pt3Print( const Point3 *v )
  29. {
  30.     /* Only works if Pt3Coord is a float */
  31.     printf("[%g %g %g]\n", v->x, v->y, v->z);
  32. }
  33.  
  34. void
  35. Pt3From(Point3 *v, double x, double y, double z)
  36. {
  37.     v->x = x;
  38.     v->y = y;
  39.     v->z = z;
  40. }
  41.  
  42. /* v2 = v1 */
  43. void
  44. Pt3Copy( const Point3 *v1, Point3 *v2 )
  45. {
  46.     v2->x = v1->x;
  47.     v2->y = v1->y;
  48.     v2->z = v1->z;
  49. }
  50.  
  51. /* v3 = v1 + v2 */
  52. void
  53. Pt3Add( const Point3 *v1, const Point3 *v2, Point3 *v3 )
  54. {
  55.     v3->x = v1->x + v2->x;
  56.     v3->y = v1->y + v2->y;
  57.     v3->z = v1->z + v2->z;
  58. }
  59.  
  60. /* v3 = v1 - v2 */
  61. void
  62. Pt3Sub( const Point3 *v1, const Point3 *v2, Point3 *v3)
  63. {
  64.     v3->x = v1->x - v2->x;
  65.     v3->y = v1->y - v2->y;
  66.     v3->z = v1->z - v2->z;
  67. }
  68.  
  69. /* v2 = s * v1  */
  70. void
  71. Pt3Mul( double s, const Point3 *v1, Point3 *v2 )
  72. {
  73.     v2->x = s*v1->x;
  74.     v2->y = s*v1->y;
  75.     v2->z = s*v1->z;
  76. }
  77.  
  78.  
  79. /* v1 . v2 */
  80. Pt3Coord
  81. Pt3Dot( const Point3 *v1, const Point3 *v2 )
  82. {
  83.     return v1->x*v2->x+v1->y*v2->y+v1->z*v2->z;
  84. }
  85.  
  86. /* v3 = v1 x v2 */
  87. void
  88. Pt3Cross( const Point3 *v1, const Point3 *v2, Point3 *v3 )
  89. {
  90.     v3->x = v1->y*v2->z-v1->z*v2->y; 
  91.     v3->y = v1->z*v2->x-v1->x*v2->z; 
  92.     v3->z = v1->x*v2->y-v1->y*v2->x;
  93. }
  94.  
  95. /* v1 . (v2 x v3) */
  96. Pt3Coord 
  97. Pt3TripleDot( const Point3 *v1, const Point3 *v2, const Point3 *v3 )
  98. {
  99.     return v1->x*(v2->y*v3->z-v2->z*v3->y) 
  100.          + v1->y*(v2->z*v3->x-v2->x*v3->z) 
  101.          + v1->z*(v2->x*v3->y-v2->y*v3->x);
  102. }
  103.  
  104. /* v4 = (v1 x v2) x v3 */
  105. void
  106. Pt3TripleCross( const Point3 *v1, const Point3 *v2, const Point3 *v3, Point3 *v4 )
  107. {
  108.     Point3 v;
  109.  
  110.     Pt3Cross( v1, v2, &v );
  111.     Pt3Cross( &v, v3, v4 );
  112. }
  113.  
  114. Pt3Coord
  115. Pt3Length( const Point3 *v )
  116. {
  117.     return sqrt( v->x*v->x + v->y*v->y + v->z*v->z );
  118. }
  119.  
  120. Pt3Coord 
  121. Pt3Distance( const Point3 *v1, const Point3 *v2 )
  122. {
  123.     Point3 v12;
  124.     
  125.     Pt3Sub(v1,v2,&v12);
  126.  
  127.     return Pt3Length(&v12);
  128. }
  129.  
  130. Pt3Coord
  131. Pt3Angle( const Point3 *v1, const Point3 *v2 )
  132. {
  133.  
  134.   return(acos(Pt3Dot(v1, v2) / (Pt3Length(v1) * Pt3Length(v2))));
  135.  
  136. }
  137.  
  138. void
  139. Pt3Unit( Point3 *v )
  140. {
  141.     Pt3Coord len;
  142.  
  143.     len = Pt3Length(v);
  144.     if( len != 0. && len != 1. )
  145.     Pt3Mul( 1./len, v, v );
  146. }
  147.  
  148.  
  149. /*
  150.  * lerp - linear interpolation
  151.  *
  152.  * v3 = (1-t)*v1 + t*v2
  153.  */
  154. void
  155. Pt3Lerp( double t, const Point3 *v1, const Point3 *v2,  Point3 *v3 )
  156. {
  157.     v3->x = (1.-t)*v1->x + t*v2->x;
  158.     v3->y = (1.-t)*v1->y + t*v2->y;
  159.     v3->z = (1.-t)*v1->z + t*v2->z;
  160. }
  161.  
  162. void
  163. Pt3Comb( double t1, const Point3 *v1, double t2, const Point3 *v2, Point3 *v3 )
  164. {
  165.     v3->x = t1*v1->x + t2*v2->x;
  166.     v3->y = t1*v1->y + t2*v2->y;
  167.     v3->z = t1*v1->z + t2*v2->z;
  168. }
  169.  
  170.  
  171. /* vectors equal */
  172. int 
  173. Pt3Equal( const Point3 *v1, const Point3 *v2 )
  174. {
  175.     Pt3Coord v;
  176.     
  177.     v = Pt3Distance(v1, v2);
  178.  
  179.     return fz(v);
  180. }
  181.  
  182. /* parallel vectors */
  183. int 
  184. Pt3Parallel( const Point3 *v1, const Point3 *v2 )
  185. {
  186.     Point3 v3;
  187.     Pt3Coord v;
  188.     
  189.     Pt3Cross(v1,v2,&v3);
  190.     v=Pt3Length(&v3);
  191.  
  192.     return fz(v);
  193. }
  194.  
  195. /* perpendicular vectors */
  196. int 
  197. Pt3Perpendicular( const Point3 *v1, const Point3 *v2 )
  198. {
  199.     Pt3Coord v;
  200.  
  201.     v=Pt3Dot(v1,v2);
  202.  
  203.     return fz(v);
  204. }
  205.  
  206. void
  207. Pt3Transform( T, p1, p2 )
  208.     Transform3 T;
  209.     Point3 *p1, *p2;
  210. {
  211.     register Pt3Coord x, y, z, w;
  212.  
  213.     x = p1->x;
  214.     y = p1->y;
  215.     z = p1->z;
  216.     w = (T[X][W]*x + T[Y][W]*y + T[Z][W]*z + T[W][W]);
  217.     if(w != 1.0) {
  218.     w = 1.0 / w;
  219.     p2->x = w * (x*T[X][X] + y*T[Y][X] + z*T[Z][X] + T[W][X]);
  220.     p2->y = w * (x*T[X][Y] + y*T[Y][Y] + z*T[Z][Y] + T[W][Y]);
  221.     p2->z = w * (x*T[X][Z] + y*T[Y][Z] + z*T[Z][Z] + T[W][Z]);
  222.     } else {
  223.     p2->x = x*T[X][X] + y*T[Y][X] + z*T[Z][X] + T[W][X];
  224.     p2->y = x*T[X][Y] + y*T[Y][Y] + z*T[Z][Y] + T[W][Y];
  225.     p2->z = x*T[X][Z] + y*T[Y][Z] + z*T[Z][Z] + T[W][Z];
  226.     }
  227. }
  228.  
  229. void
  230. Pt3TransformN( T, p1, p2, n )
  231.    Transform3 T;
  232.    Point3 *p1, *p2;
  233.    int n;
  234. {
  235.     while( n-- ) 
  236.     Pt3Transform( T, p1++, p2++ );
  237. }
  238.  
  239. void 
  240. NormalTransform( T, a, b )
  241.    Transform3 T;
  242.    Point3 *a, *b;
  243. {
  244.   Pt3Transform(T, a, b);
  245.   b->x -= T[W][X];
  246.   b->y -= T[W][Y];
  247.   b->z -= T[W][Z];
  248.   Pt3Unit(b);
  249. }
  250.  
  251. void 
  252. NormalTransformN( T, a, b, n )
  253.    Transform3 T;
  254.    Point3 *a, *b;
  255.    int n;
  256. {
  257.   while ( n-- )
  258.     NormalTransform( T, a++, b++ );
  259. }
  260.